package com.zeus.core.report;

import com.zeus.common.utils.DateUtils;
import com.zeus.common.utils.HashUtils;
import com.zeus.common.utils.MarkdownUtils;
import com.zeus.core.context.ZeusContext;

import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * 宙斯报告助手抽象类
 *
 * @author f1ybear_wang  2022/2/22 7:57 下午
 */
public abstract class AbstractLogZeusReportClient extends AbstractZeusReportClient {
    /**
     * 扩展信息是否已经初始化
     */
    protected boolean parsingExtendInit;
    /**
     * 文件名
     */
    protected String fileName;
    /**
     * 方法名
     */
    protected String methodName;
    /**
     * 行号
     */
    protected String lineNumber;
    /**
     * 日志内容
     */
    protected String message;
    /**
     * 日志名称
     */
    protected String loggerName;
    /**
     * 异常信息
     */
    protected String exceptionMessage;
    /**
     * 异常堆栈
     */
    protected String stackTrace;

    public AbstractLogZeusReportClient() {
        super();
    }

    @Override
    public String uniqueCode() {
        if (!parsingExtendInit) {
            parsingExtend();
        }
        if (fileName == null || fileName.isEmpty() || methodName == null || methodName.isEmpty()
            || lineNumber == null) {
            return String.valueOf(HashUtils.bkdrHash(loggerName + message));
        }

        // 获取类+方法+行
        return String.valueOf(HashUtils.bkdrHash(fileName + methodName + lineNumber));
    }

    @Override
    protected String workDingTalkMessage() {
        // 组装提醒内容字符串
        StringBuilder sb = new StringBuilder();
        // 标题
        sb.append(getTitle());

        // 加工基本指标
        sb.append(MarkdownUtils.getItem("时间", DateUtils.getSimpleString(this.occurrenceTime)));
        if (super.traceIdIsNotEmpty()) {
            sb.append(MarkdownUtils.getItem("traceId", this.traceId));
        }
        sb.append(MarkdownUtils.getItem("ELK", getElkUrl()));
        sb.append(MarkdownUtils.getItem("类信息", getClassInfo()));
        sb.append(MarkdownUtils.getItem("报警内容", getMessage(this.message)));
        sb.append(MarkdownUtils.getItem("异常信息", getExceptionMessage(this.exceptionMessage)));
        sb.append(MarkdownUtils.getItem("堆栈信息", getStackTrace(this.stackTrace)));
        sb.append(MarkdownUtils.getItem("请求地址", getRequestUrl()));
        sb.append(MarkdownUtils.getItem("参数信息", getArgs()));
        sb.append(MarkdownUtils.getItem("请求应用", getRequestApp()));
        sb.append(MarkdownUtils.getItem("请求IP", getRequestIp()));
        sb.append(MarkdownUtils.getItem("部署Tag", ZeusContext.getContext().getDeployTag()));
        sb.append(MarkdownUtils.getItem("服务器IP", ZeusContext.getContext().getHostIp()));
        sb.append(MarkdownUtils.getItem("服务器名称", ZeusContext.getContext().getHostName()));
        return sb.toString();
    }

    private String getClassInfo() {
        return Stream.of(this.loggerName, this.methodName, this.lineNumber).filter(e -> e != null && !e.isEmpty())
            .collect(Collectors.joining("#"));
    }
}
